package com.jungle.sp.daily.feature.d7_virtual_thread;

import lombok.SneakyThrows;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * @author Jungle
 * @create 2024-07-14 9:13
 */
public class Demo2 {
    @SneakyThrows
    public static void main(String[] args) {
        // 虚拟线程的四种创建方式
        //     方式1; 使用  Thread.startVirtualThread
        // Thread thread = Thread.startVirtualThread(() -> System.out.println("测试虚拟线程 方式1"));
        // thread.join();

        //     方式2; 使用  Thread.ofVirtual().name("虚拟线程测试1").start(()
        // Thread t2 = Thread.ofVirtual().name("虚拟线程测试1").start(() ->  System.out.println("测试虚拟线程 方式2"));
        // Thread t3 = Thread.ofVirtual().name("虚拟线程测试2").unstarted(() -> System.out.println("测试虚拟线程 方式2"));
        // t2.join();
        // t3.start();
        // t3.join();

        //     方式3; 使用  TThread.ofVirtual().factory() 创建线程
        // ThreadFactory factory = Thread.ofVirtual().factory();
        // Thread t3 = factory.newThread(() -> System.out.println("测试虚拟线程 方式3"));
        // t3.start();
        // t3.join();

        //     方式4; 使用 Executors.newVirtualThreadPerTaskExecutor() 创建线程
        try (ExecutorService service = Executors.newVirtualThreadPerTaskExecutor()) {
            Future<String> f1 = service.submit(new MyCallable(10));
            Future<String> f2 = service.submit(new MyCallable(20));
            Future<String> f3 = service.submit(new MyCallable(30));
            System.out.println(f1.get());
            System.out.println(f2.get());
            System.out.println(f3.get());

        }

    }
}
